#include"BlockQueue.hpp"
#include"Task.hpp"
#include<pthread.h>
#include<ctime>
#include <sys/types.h>
#include <unistd.h>

void* consumer(void* args)//消费方
{
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(args); 

    while(true)
    {
        sleep(1);
        //1.消费数据
        Task t;
        bq->Pop(&t);
        //2.进行处理
        t.Run();
       cout<<"consumer data:    "<<t.Printresult()<<endl;

    }
    return nullptr;
}

void* producter(void* args)//生产方
{
    BlockQueue<Task>* bq=static_cast<BlockQueue<Task>*>(args); 

    while(true)
    {
        //1.有数据
         int data1=rand()%10;
         usleep(1000);//为了防止生成的数更加随机，所以休眠一会
         int data2=rand()%10;

        char oper=opers[rand()%(opers.size())];
          Task t(data1,data2,oper);
         //for debug
        string task_string=t.Printtask();
        cout<<"productor    task;   "<<task_string<<endl;

        
        //2.进行生产
       bq->Push(t);


       


       //sleep(1);

    }

    return nullptr;
}

int main()
{
    srand((uint16_t)time(nullptr)^getpid()^pthread_self());
    //可不可以让生产者给消费的分派任务呢

    BlockQueue<Task>* bq=new BlockQueue<Task>();
    // BlockQueue<int>* bq=new BlockQueue<int>();

    pthread_t c,p;
    pthread_create(&c,nullptr,consumer,bq); 
    pthread_create(&p,nullptr,producter,bq);

    pthread_join(c,nullptr);
    pthread_join(p,nullptr);
    return 0;

}